package cn.yang.domain.activity.service.quota;

import cn.yang.domain.activity.model.entity.ActivityCountEntity;
import cn.yang.domain.activity.model.entity.ActivityEntity;
import cn.yang.domain.activity.model.entity.ActivitySkuEntity;
import cn.yang.domain.activity.repository.IActivityRepository;
import cn.yang.domain.activity.service.quota.rule.factory.DefaultActivityChainFactory;

/**
 * @version v1.0
 * @ClassName: cn.yang.domain.activity.service
 * @Description: 抽奖活动的支撑类
 *
 * 主要负责为抽奖活动提供通用的支持功能
 *
 * 里氏替换原则：
 *    所有引用父类的地方必须能透明地使用其子类的对象，即子类对象必须能够完全替代父类对象，而程序的功能不会受到任何影响。
 * @Author: YJ
 */
public class RaffleActivityAccountQuotaSupport {

    // protected的作用，让子类能够访问核心组件，符合里氏替换原则和开闭原则
    protected DefaultActivityChainFactory defaultActivityChainFactory;
    // 依赖抽象而非具体实现：依赖的是IActivityRepository接口，而非具体的实现类，这遵循了依赖倒置原则
    protected IActivityRepository activityRepository;

    /**
     * 完全依赖注入：要求外部提供所有必要依赖
     * 工厂模式的应用：让子类决定实例化哪个类
     * 1. 解耦对象创建逻辑
     * 2. 便于替换不同的工厂实现
     * @param defaultActivityChainFactory 抽奖活动规则工厂
     * @param activityRepository 活动仓储接口
     */
    public RaffleActivityAccountQuotaSupport(DefaultActivityChainFactory defaultActivityChainFactory, IActivityRepository activityRepository) {
        this.defaultActivityChainFactory = defaultActivityChainFactory;
        this.activityRepository = activityRepository;
    }

    public ActivitySkuEntity queryActivitySku(Long sku) {
        return activityRepository.queryActivitySku(sku);
    }

    public ActivityEntity queryRaffleActivityByActivityId(Long activityId) {
        return activityRepository.queryRaffleActivityByActivityId(activityId);
    }

    public ActivityCountEntity queryRaffleActivityCountByActivityCountId(Long activityCountId) {
        return activityRepository.queryRaffleActivityCountByActivityCountId(activityCountId);
    }

}
